package com.studentstreet;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.Html;
import android.text.Spanned;
import android.text.TextWatcher;
import android.text.method.LinkMovementMethod;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.Toast;

import com.studentstreet.tools.HttpHelper;
import com.studentstreet.tools.MD5;
import com.studentstreet.tools.PreferenceTools;
import com.studentstreet.tools.Util;

public class LoginDialog extends Activity {

	// 用户名编辑框
	private EditText userNameEdit = null;
	// 密码编辑框
	private EditText passwordEdit = null;
	// 是否保存密码CheckBox
	private CheckBox savePwdCheckBox = null;
	// 是否保存密码标识
	private boolean isSavePassword = false;
	// 登录按钮
	private Button loginButton = null;
	// 注册按钮
	private TextView registText = null;
	// 用户名
	private String userName = "";
	// 密码
	private String password = "";
	// TAG
	private String TAG = "LoginDialog";
	// 获取的密码是否已加密
	boolean flag = false;

	// 有关网络操作
	// 登录进度对话框
	private ProgressDialog loginProgressDialog = null;
	// 服务器返回信息
	private String responseMsg = "";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// Activity无标题
		requestWindowFeature(Window.FEATURE_NO_TITLE);

		setContentView(R.layout.login_dialog);
		// 将当前Activity压入堆栈中
		MyApp.getInstance().addActivity(this);
		// 布局个性化，主要设置改对话框的透明度，以及显示的亮度
		setDialogAlpha(0.8f);

		// 初始化UI
		initUI();
	}

	// 设置对话框的透明度，最重要的目的是点登录按钮后将登录界面隐藏
	private void setDialogAlpha(float f) {
		Window wd = getWindow();
		WindowManager.LayoutParams windwonLP = wd.getAttributes();
		windwonLP.alpha = f;
		wd.setAttributes(windwonLP);
	}

	// 初始化UI
	private void initUI() {
		userNameEdit = (EditText) findViewById(R.id.userNameEdit);
		passwordEdit = (EditText) findViewById(R.id.passwordEdit);
		loginButton = (Button) findViewById(R.id.loginButton);
		savePwdCheckBox = (CheckBox) findViewById(R.id.savePwdCheckBox);
		registText = (TextView) findViewById(R.id.regText);
		registText.setText(getRegHtml(R.string.register));
		// 让TextView识别<a>标签连接
		registText.setMovementMethod(LinkMovementMethod.getInstance());

		// 添加“是否保存密码” 复选框的监听器
		savePwdCheckBox
				.setOnCheckedChangeListener(new OnCheckedChangeListener() {
					@Override
					public void onCheckedChanged(CompoundButton buttonView,
							boolean isChecked) {
						if (isChecked) {
							savePwdCheckBox.setChecked(true);
							isSavePassword = true;
						} else {
							savePwdCheckBox.setChecked(false);
							isSavePassword = false;
						}
					}
				});

		if (savePwdCheckBox.isChecked()) {
			isSavePassword = true;
		}

		// 取得可能已经保存的用户名和密码；
		PreferenceTools prefTools = new PreferenceTools(this);
		userName = prefTools.getUserName();
		password = prefTools.getUserPwd();

		if (userName != "") {
			userNameEdit.setText(userName);
			passwordEdit.requestFocus();
		}
		if (password != "") {
			passwordEdit.setText(password);
			flag = true;// 此时的密码是加密的
			loginButton.requestFocus();
		}

		// 给密码输入框添加加监听值改变事件
		passwordEdit.addTextChangedListener(new TextWatcher() {
			@Override
			public void onTextChanged(CharSequence s, int start, int before,
					int count) {
			}

			@Override
			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
			}

			@Override
			public void afterTextChanged(Editable s) {
				// 当值改变时，说明当前密码就是未加密的密码
				flag = false;
			}
		});

		// 登录按钮监听器
		loginButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// 首先验证密码是否为空
				if (!initAndValidate()) {
					return;
				}
				// 隐藏该对话框,即设置透明度为完全透明
				setDialogAlpha(0f);
				// 显示登录进度对话框
				loginProgressDialog = new ProgressDialog(LoginDialog.this);
				loginProgressDialog.setTitle(getResources().getString(
						R.string.login));
				loginProgressDialog.setMessage(getResources().getString(
						R.string.logining));
				loginProgressDialog.show();

				// 启动登录进程
				Thread loginThread = new Thread(new LoginThread());
				loginThread.start();
			}
		});

	}

	// 取得用户名和密码，并检测用户名、密码是否为空
	public boolean initAndValidate() {
		userName = userNameEdit.getText().toString().trim();
		password = passwordEdit.getText().toString().trim();
		// 如果用户名为空，显示错误提示信息，不通过
		if (userName.equals("")) {
			userNameEdit.requestFocus();
			userNameEdit.setError(getResources().getString(
					R.string.userName_request));
			return false;
		}
		// 如果密码为空，显示错误提示信息，不通过
		if (password.equals("")) {
			passwordEdit.requestFocus();
			passwordEdit.setError(getResources().getString(
					R.string.password_request));
			return false;
		}
		return true;
	}

	// 登录进程处理登录信息
	class LoginThread implements Runnable {

		@Override
		public void run() {
			// 如果密码尚未加密（刚输入的），对密码进行 MD5 加密
			if (!flag) {
				password = MD5.getMD5(password);
			}
			// 向服务器发送请求
			boolean loginValidate = loginServer(userName, password);
			Message msg = handler.obtainMessage();
			// 获得服务器响应信息，验证用户名及其密码是否正确
			if (loginValidate) {
				// 用户名和密码验证正确
				if (responseMsg.trim().startsWith("success")) {
					msg.what = 0;
				}
				// 用户名或密码错误
				else if (responseMsg.trim().equals("failed")) {
					msg.what = 1;
				}
				/*
				// 密码错误
				else if (responseMsg.trim().equals("password_is_wrong")) {
					msg.what = 2;
					// 都错误
				}*/ else {
					msg.what = 2;
				}
				// 网路错误
			} else {
				msg.what = 3;
			}
			// 将消息添加到消息队列，待处理
			handler.sendMessage(msg);
		}

	}

	// 向服务器发送请求
	public boolean loginServer(String userName, String password) {
		// loginValidate :是否通过验证
		boolean loginValidate = false;
		// 使用apache HTTP客户端实现
		String urlStr = Util.BASE_URL + "/servlet/LoginServlet";
		// 创建网络连接工具对象
		HttpHelper helper = new HttpHelper(urlStr);
		// 添加参数
		// 用户名
		helper.addParam("userName", userName);
		// 密码
		helper.addParam("password", password);
		// 获得服务器返回的数据
		responseMsg = helper.getResponse();
		// 如果返回的数据不为空，修改登录标志为 true
		if (!"".equals(responseMsg)) {
			loginValidate = true;
		}
		return loginValidate;
	}

	// Handler
	Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			loginProgressDialog.dismiss();
			switch (msg.what) {
			case 0:// 登录成功
					// 将登陆信息保存到sharePreference
				PreferenceTools prefTools = new PreferenceTools(
						LoginDialog.this);
				if (isSavePassword) {
					prefTools.saveLoginInfo(responseMsg.split(",")[1], password);
				} else {
					prefTools.saveLoginInfo(responseMsg.split(",")[1]);
				}

				// 显示登录成功提示信息
				Toast.makeText(getApplicationContext(),
						getResources().getString(R.string.login_succssed),
						Toast.LENGTH_SHORT).show();
				LoginDialog.this.setResult(RESULT_OK);
				finish();
				break;
			case 1:// 用户名出错
					// 重新显示登录对话框
				setDialogAlpha(0.8f);
				// 清空输入框
				//userNameEdit.setText("");
				passwordEdit.setText("");
				// 显示用户名错误提示
				userNameEdit.setError(getResources().getString(
						R.string.userName_is_wrong));
				passwordEdit.setError(getResources().getString(
						R.string.password_is_wrong));
				userNameEdit.requestFocus();
				break;
			case 2:// 密码出错
				setDialogAlpha(0.8f);
				userNameEdit.setText("");
				// 清空密码输入框
				passwordEdit.setText("");
				// 显示密码错误提示
				passwordEdit.setError(getResources().getString(
						R.string.password_is_wrong));
				passwordEdit.requestFocus();
				break;
			case 3:
				// 网络错误提示
				Toast.makeText(
						getApplicationContext(),
						getResources()
								.getString(R.string.cannot_arrived_server),
						Toast.LENGTH_LONG).show();
				finish();
				break;
			}

			super.handleMessage(msg);
		}

	};

	private Spanned getRegHtml(int resId) {
		String html = "<a href='" + Util.BASE_URL + "'>";
		html += getResources().getString(resId);
		html += "</a>";
		return Html.fromHtml(html);
	}

}
